package cl.sodexo.com.action;

import java.io.File;
import java.io.FileOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

import cl.sodexo.com.delegate.IngresoDelegate;
import cl.sodexo.com.dto.Usuario;
import cl.sodexo.com.form.NuevoRequerimientoForm;
import cl.sodexo.com.utils.Constantes;

/**
 * @author psep
 *
 */
public class NuevoRequerimientoAction extends AbstractManagerDAO{
	
	private final static Logger logger = Logger.getLogger(NuevoRequerimientoAction.class);
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session	= request.getSession();
		Usuario user		= (Usuario) session.getAttribute(Constantes.USEROBJ); 
		
		if(!(Boolean) request.getSession().getAttribute(Constantes.SESSION)){
			return mapping.findForward(Constantes.ERROR); //TODO verificar página de dirección login
		}else if(!user.getPerfil().getIdPerfil().equals(Constantes.USER)
				&& !user.getPerfil().getIdPerfil().equals(Constantes.ADMIN)){
			return mapping.findForward(Constantes.ERROR); //TODO verificar página de dirección login
		}else{
			NuevoRequerimientoForm nuevoReqForm = (NuevoRequerimientoForm) form;
			nuevoReqForm.getReqmto().setUsuarioSolicitante(user);
			
			if(request.getParameter(Constantes.ACTION) != null 
					&& request.getParameter(Constantes.ACTION).equals(Constantes.CREATE)){
				if(nuevoReqForm.getReqmto().getTipoRequerimiento().getIdTipo() == null
						|| nuevoReqForm.getReqmto().getTipoRequerimiento().getIdTipo().equals("")){
					nuevoReqForm.setMessage("Debe seleccionar el Tipo de Requerimiento");
				}else if(nuevoReqForm.getReqmto().getDetalle() == null
						|| nuevoReqForm.getReqmto().getDetalle().trim().equals("")){
					nuevoReqForm.setMessage("Debe ingresar Detalle de Requerimiento");
				}else{
					String key		= java.util.UUID.randomUUID().toString();
					
					this.saveFile(nuevoReqForm, key);
					
					nuevoReqForm.getReqmto().setKey(key);
					
					if(!super.getRequerimientoDAO().insertRequerimiento(nuevoReqForm.getReqmto())){
						nuevoReqForm.setMessage("Error al Grabar, Intente más tarde");
					}else{
						super.beanRemote.inicializaProceso(Constantes.PROCESS, key, user.getUsername());
						nuevoReqForm.setMessage("Requerimiento grabado con éxito");
						
						this.actionMail(nuevoReqForm);
						
						logger.info("Limpieza de campos");
						nuevoReqForm.reset(mapping, request);
						nuevoReqForm.setUrl("listaRequerimientos.do");
					}
				}
			}
		
    	    return mapping.findForward(Constantes.SUCCESS);
		}

	}
	
	/**
	 * @param form
	 * @param key
	 * @throws Exception
	 */
	private void saveFile(NuevoRequerimientoForm form, String key) throws Exception{
		FormFile file	= form.getArchivo();
		
		if(file.getFileName() != null && !file.getFileName().equals("")){
			String filePath = System.getProperty("jboss.server.home.dir") + "/deploy/IngresoRequerimiento.war/files/";
			File folder		= new File(filePath);
			if(!folder.exists()){folder.mkdir();}
			String fileName = "Requerimiento_" + key + "_" + file.getFileName();
			
			if(fileName != null && !fileName.equals("")){
				logger.info("PATH: " + filePath);
				logger.info("FileName: " + fileName);
				
				File newFile = new File(filePath, fileName);
				
				if(!newFile.exists()){
					FileOutputStream fos = new FileOutputStream(newFile);
					fos.write(file.getFileData());
					fos.flush();
					fos.close();
					form.getReqmto().setFilePath("files/" + fileName);
				}
			}
		}
	}
	
	/**
	 * @param form
	 */
	private void actionMail(NuevoRequerimientoForm form){
		IngresoDelegate delegate = new IngresoDelegate();
		
		if(form.getReqmto().getTipoRequerimiento().getIdTipo().equals("1")){
			delegate.sendEmail("carlos.neira@sodexo.com"); //TODO email
		}else{
			delegate.sendEmail("carlos.neira@sodexo.com");
		}
	}

}
